import * as underscore from './utils/underscore';

// 偏函数，局部应用

// 柯里化与局部应用
// 柯里化是将一个多参数函数转换成多个单参数函数，也就是将一个 n 元函数转换成 n 个一元函数
// 局部应用则是固定一个函数的一个或者多个参数，也就是将一个 n 元函数转换成一个 n - x 元函数

// partial
// function add (a, b) {
//   return a + b;
// }

// var addOne = add.bind(null, 1);

// console.log(addOne(4));

// 第一版
// 闭包保存参数
// function partial (fn) {
//   var args = [].slice.call(arguments, 1);
//   return function () {
//     var newArgs = args.concat([].slice.call(arguments));
//     return fn.apply(this, newArgs);
//   }
// }
// function partial (fn, ...args) {
//   return function (...outerArgs) {
//     return fn.call(this, ...args, ...outerArgs)
//   }
// }

function partial (fn) {
  var args = [].slice.call(arguments, 1);
  return function () {
    var newArgs = args.concat([].slice.call(arguments));
    return fn.apply(this, newArgs);
  }
}

function add (a, b) {
  return a + b + this.value;
}

var addOne = partial(add, 1);

var obj = {
  value: 3,
  addOne
}
console.log(obj.addOne(3))
